﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Sinacor.Infra.UI.Common;

namespace Sinacor.UI.Bovespa.ResumoFinanceiro.Communication.Translator.ModelToProcessEntity
{
    public class CalculoFinanceiro
    {
        #region Construtor

        /// <summary>
        /// Construtor padrão
        /// </summary>
        public CalculoFinanceiro()
        {
        }

        #endregion

        #region Métodos

        public Process.Bovespa.CalculoFinanceiro.ProcessEntity.Parameter.FiltroCalculoFinanceiro ToFiltroCalculoFinanceiro(Model.Parameter.FiltroCalculoFinanceiro from)
        {
            if (from == null) return null;

            return new Sinacor.Process.Bovespa.CalculoFinanceiro.ProcessEntity.Parameter.FiltroCalculoFinanceiro
            {
                CalculaTudo = from.CalculaTudo,
                Filtro = this.ToFiltroFinanceiroPendente(from.Filtro),
                FinanceirosPendentes = this.ToFinanceiroPendente(from.FinanceirosPendentes),
                MaquinaUsuario = from.MaquinaUsuario,
                TipoSistema = (Process.Bovespa.CalculoFinanceiro.ProcessEntity.Enum.TipoSistema)from.TipoSistema
            };
        }

        public Process.Bovespa.CalculoFinanceiro.ProcessEntity.Parameter.FiltroFinanceiroPendente ToFiltroFinanceiroPendente(Model.Parameter.FiltroFinanceiroPendente from)
        {
            Sinacor.Process.Bovespa.CalculoFinanceiro.ProcessEntity.Parameter.FiltroFinanceiroPendente retorno =
                new Sinacor.Process.Bovespa.CalculoFinanceiro.ProcessEntity.Parameter.FiltroFinanceiroPendente();
            
            if (from == null) return null;

            
            retorno.CodigoBroker = from.Broker == null ? null : from.Broker.Codigo;
            retorno.CodigoCliente = from.Cliente == null ? null : from.Cliente.Codigo;
            retorno.DataPregao = from.DataPregao;

            if (from.IndicadorBroker != null)
            {
                switch (from.IndicadorBroker.Value)
                {
                    case Sinacor.UI.Bovespa.ResumoFinanceiro.Model.Enum.TipoCliente.Broker:
                        retorno.IndicadorBroker = Sinacor.Process.Bovespa.CalculoFinanceiro.ProcessEntity.Enum.TipoCliente.Broker;
                        break;
                    case Sinacor.UI.Bovespa.ResumoFinanceiro.Model.Enum.TipoCliente.Financeiro:
                        retorno.IndicadorBroker = Sinacor.Process.Bovespa.CalculoFinanceiro.ProcessEntity.Enum.TipoCliente.Financeiro;
                        break;
                    case Sinacor.UI.Bovespa.ResumoFinanceiro.Model.Enum.TipoCliente.Cliente:
                        retorno.IndicadorBroker = Sinacor.Process.Bovespa.CalculoFinanceiro.ProcessEntity.Enum.TipoCliente.Cliente;
                        break;
                }
            }

            return retorno;
        }

        public Process.Bovespa.CalculoFinanceiro.ProcessEntity.FinanceiroPendente ToFinanceiroPendente(Model.FinanceiroPendente from)
        {
            Sinacor.Process.Bovespa.CalculoFinanceiro.ProcessEntity.FinanceiroPendente retorno = null;

            if (from != null)
            {
                retorno = new Sinacor.Process.Bovespa.CalculoFinanceiro.ProcessEntity.FinanceiroPendente();

                retorno.ApelidoBroker = from.ApelidoBroker;
                retorno.ApelidoCliente = from.ApelidoCliente;
                retorno.BolsaFaturamento = from.BolsaFaturamento;
                retorno.CodigoBroker = from.CodigoBroker;
                retorno.CodigoCliente = from.CodigoCliente;
                retorno.DataLiquidacao = from.DataLiquidacao;
                retorno.DataPregao = from.DataPregao;
                retorno.DataUltimaAlocacao = from.DataUltimaAlocacao;
                retorno.DataUltimaAtualizacao = from.DataUltimaAtualizacao;
                retorno.Identificador = from.Identificador;
                retorno.LiquidacaoNota = from.LiquidacaoNota;

                switch (from.IndicadorBroker)
                {
                    case Model.Enum.TipoCliente.Broker:
                        retorno.IndicadorBroker = Sinacor.Process.Bovespa.CalculoFinanceiro.ProcessEntity.Enum.TipoCliente.Broker;
                        break;
                    case Model.Enum.TipoCliente.Financeiro:
                        retorno.IndicadorBroker = Sinacor.Process.Bovespa.CalculoFinanceiro.ProcessEntity.Enum.TipoCliente.Financeiro;
                        break;
                    case Model.Enum.TipoCliente.Cliente:
                        retorno.IndicadorBroker = Sinacor.Process.Bovespa.CalculoFinanceiro.ProcessEntity.Enum.TipoCliente.Cliente;
                        break;
                }
            }

            return retorno;
        }

        public List<Process.Bovespa.CalculoFinanceiro.ProcessEntity.FinanceiroPendente> ToFinanceiroPendente(ModelCollection<Model.FinanceiroPendente> from)
        {
            List<Process.Bovespa.CalculoFinanceiro.ProcessEntity.FinanceiroPendente> retorno = new List<Process.Bovespa.CalculoFinanceiro.ProcessEntity.FinanceiroPendente>();
            
            if (from == null) return null;

            foreach (Model.FinanceiroPendente item in from)
            {
                retorno.Add(this.ToFinanceiroPendente(item));
            }

            return retorno;
        }

        #endregion
    }
}
